
package com.findlocation.persistence.tech.dao;

import java.io.Serializable;

import org.apache.commons.lang.builder.CompareToBuilder;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;

/**
 * Classe abstraite d'objet (metier) identifiable du projet ViamedisNet.
 * 
 * @param <I>
 *           Identifiant d'objet metier.
 */
@SuppressWarnings("unchecked")
public abstract class ObjetIdentifiable<I extends Serializable> implements ObjetMetier<I>
{
   /**
    * 
    */
   private static final long serialVersionUID = 8365148321116455109L;

   /**
    * Retourne l'identifiant de l'objet metier (obligatoire).
    * 
    * @return Identifiant de l'objet metier (obligatoire).
    */
   public abstract I getId();
   /**
    * Affecte l'identifiant de l'objet metier (obligatoire).
    * 
    * @param anId
    *           Identifiant de l'objet metier (obligatoire).
    */
   public abstract void setId( I anId );
   
   
   public boolean equals( Object anObjet )
   {
      if( anObjet == this )
      {
         return true;
      }
      if( ( anObjet == null ) || !this.getClass().equals( anObjet.getClass() ) )
      {
         return false;
      }
      ObjetIdentifiable<I> l_identifiable = (ObjetIdentifiable<I>) anObjet;
      return new EqualsBuilder()
      .append( this.getId(), l_identifiable.getId() )
      .isEquals();
   }
   @Override
   public int hashCode()
   {
      return new HashCodeBuilder()
      .append( this.getId() )
      .toHashCode();
   }
   @Override
   public String toString()
   {
      return new ToStringBuilder( this, ToStringStyle.SHORT_PREFIX_STYLE )
      .append( this.getId() )
      .toString();
   }
   /**
    * @see Comparable#compareTo(Object)
    */
   public int compareTo( I anObjet )
   {
      ObjetIdentifiable<I> l_identifiable = (ObjetIdentifiable<I>) anObjet;
      return new CompareToBuilder()
      .append( this.getId(), l_identifiable.getId() )
      .toComparison();
   }
}
